home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 1 / QRZ Ham Radio Callsign Database - December 1993.iso / ucsd / dsp / bel202.asm < prev    next >
Encoding:
Assembly Source File  |  1988-08-09  |  17.7 KB  |  914 lines

  1. ;         AMSAT/TAPR DSP BEL-202 modem.  Filter splitter design
  2. ;            Sample rate should be set to 9600 samples/sec. 
  3. ;                  code by Bob McGwier N4HY
  4.      org 0
  5.      b go
  6.      org 16
  7. sine:   equ 0    ;  will store sine values from tone
  8. one:    equ 1      ;  guess what goes here duhhhhh!
  9. energy: equ 2
  10. thresh: equ 3
  11. maskl:  equ 4    ;  mask for fine or low order bits of phase
  12. mask:   equ 5    ;  mask for doing modulo 16384 arithmetic with phase
  13. sinx:   equ 6    ;  used to store coarse sine value (high order bits)
  14. cosx:   equ 7    ;  as above for cosine
  15. mone:   equ 8    ;   minus one stored here
  16. wkph:   equ 9    ;  different phases (PLL, remodulator tone etc) are stored hr
  17.                  ;  for frequency synthesis
  18. masko:  equ 10   ;  mask for converting on board PCM to DAC format
  19. mps:    equ 11   ;  multiplier for quadrant determination for sine
  20. mpc:    equ 12   ;  multiplier for quadrant determination for cosine
  21. siny:   equ 13   ;  fine correction value for use in SIN(X+Y) = sinx*cosy+
  22. cosy:   equ 14   ;          cosx*siny
  23. cosine: equ 15   ;  cosine is also needed for Q arm in Costas loop
  24. coph:   equ 16   ;  working number holder
  25. modem:  equ 17   ;  Used to choose between complex tone for arms and real tone
  26.                  ;  in the modulator as explained below
  27. xn0:    equ 18
  28. xn1:    equ 19
  29. xn2:    equ 20
  30. xn3:    equ 21
  31. xn4:    equ 22
  32. xn5:    equ 23
  33. xn6:    equ 24
  34. xn7:    equ 25
  35. xn8:    equ 26
  36. xn9:    equ 27
  37. xn10:    equ 28
  38. xn11:    equ 29
  39. xn12:    equ 30
  40. xn13:    equ 31
  41. xn14:    equ 32
  42. xn15:    equ 33
  43. xn16:    equ 34
  44. xn17:    equ 35
  45. xn18:    equ 36
  46. xn19:    equ 37
  47. xn20:    equ 38
  48. xn21:    equ 39
  49. xn22:    equ 40
  50. xn23:    equ 41
  51. xn24:    equ 42
  52. xn25:    equ 43
  53. xn26:    equ 44
  54. xn27:    equ 45
  55. xn28:    equ 46
  56. xn29:    equ 47
  57. xn30:    equ 48
  58. xn31:    equ 49
  59. xn32:    equ 50
  60. b0:    equ 51
  61. b1:    equ 52
  62. b2:    equ 53
  63. b3:    equ 54
  64. b4:    equ 55
  65. b5:    equ 56
  66. b6:    equ 57
  67. b7:    equ 58
  68. b8:    equ 59
  69. b9:    equ 60
  70. b10:    equ 61
  71. b11:    equ 62
  72. b12:    equ 63
  73. b13:    equ 64
  74. b14:    equ 65
  75. b15:    equ 66
  76. b16:    equ 67
  77. b17:    equ 68
  78. b18:    equ 69
  79. b19:    equ 70
  80. b20:    equ 71
  81. freql:  equ 72   ;  low tone for remodulator stored here
  82. freqh:  equ 73   ;  high tone remod.
  83. freqo:  equ 74   ;  freqo is assigned one of the values above for remod
  84. phaseo: equ 75      ;  phaseo is the phase of the remodulator output. phase is
  85. hl12:     equ 76
  86. hl13:    equ 77
  87. hl15:    equ 78
  88. hl16:    equ 79
  89. hu13:    equ 80
  90. hu14:    equ 81
  91. hu16:    equ 82
  92. hb8:    equ 83
  93. hb9:    equ 84
  94. hb10:    equ 85
  95. tester: equ 86
  96. suml:    equ 87
  97. sumh:    equ 88
  98. clockp: equ 89
  99. clockf: equ 90
  100. clocke: equ 91
  101. clocka:    equ 92
  102. sintbl: 
  103.        dw      0  ; coarse sine table in steps of PI/64 radians to PI/2
  104.        dw    804
  105.        dw   1607
  106.        dw   2410
  107.        dw   3211
  108.        dw   4011
  109.        dw   4807
  110.        dw   5601
  111.        dw   6392
  112.        dw   7179
  113.        dw   7961
  114.        dw   8739
  115.        dw   9511
  116.        dw  10278
  117.        dw  11038
  118.        dw  11792
  119.        dw  12539
  120.        dw  13278
  121.        dw  14009
  122.        dw  14732
  123.        dw  15446
  124.        dw  16150
  125.        dw  16845
  126.        dw  17530
  127.        dw  18204
  128.        dw  18867
  129.        dw  19519
  130.        dw  20159
  131.        dw  20787
  132.        dw  21402
  133.        dw  22004
  134.        dw  22594
  135.        dw  23169
  136.        dw  23731
  137.        dw  24278
  138.        dw  24811
  139.        dw  25329
  140.        dw  25831
  141.        dw  26318
  142.        dw  26789
  143.        dw  27244
  144.        dw  27683
  145.        dw  28105
  146.        dw  28510
  147.        dw  28897
  148.        dw  29268
  149.        dw  29621
  150.        dw  29955
  151.        dw  30272
  152.        dw  30571
  153.        dw  30851
  154.        dw  31113
  155.        dw  31356
  156.        dw  31580
  157.        dw  31785
  158.        dw  31970
  159.        dw  32137
  160.        dw  32284
  161.        dw  32412
  162.        dw  32520
  163.        dw  32609
  164.        dw  32678
  165.        dw  32727
  166.        dw  32757
  167.        dw  32767  ; PI/2
  168. fines: dw      0  ; fine sine table  in steps of PI/(64*64) radians to PI/64
  169.        dw     12
  170.        dw     25
  171.        dw     37
  172.        dw     50
  173.        dw     62
  174.        dw     75
  175.        dw     87
  176.        dw    100
  177.        dw    113
  178.        dw    125
  179.        dw    138
  180.        dw    150
  181.        dw    163
  182.        dw    175
  183.        dw    188
  184.        dw    201
  185.        dw    213
  186.        dw    226
  187.        dw    238
  188.        dw    251
  189.        dw    263
  190.        dw    276
  191.        dw    289
  192.        dw    301
  193.        dw    314
  194.        dw    326
  195.        dw    339
  196.        dw    351
  197.        dw    364
  198.        dw    376
  199.        dw    389
  200.        dw    402
  201.        dw    414
  202.        dw    427
  203.        dw    439
  204.        dw    452
  205.        dw    464
  206.        dw    477
  207.        dw    490
  208.        dw    502
  209.        dw    515
  210.        dw    527
  211.        dw    540
  212.        dw    552
  213.        dw    565
  214.        dw    578
  215.        dw    590
  216.        dw    603
  217.        dw    615
  218.        dw    628
  219.        dw    640
  220.        dw    653
  221.        dw    665
  222.        dw    678
  223.        dw    691
  224.        dw    703
  225.        dw    716
  226.        dw    728
  227.        dw    741
  228.        dw    753
  229.        dw    766
  230.        dw    779
  231.        dw    791
  232. finec: dw   32767  ;ditto to above for fine sine
  233.        dw   32766
  234.        dw   32766
  235.        dw   32766
  236.        dw   32766
  237.        dw   32766
  238.        dw   32766
  239.        dw   32766
  240.        dw   32766
  241.        dw   32766
  242.        dw   32766
  243.        dw   32766
  244.        dw   32766
  245.        dw   32766
  246.        dw   32766
  247.        dw   32766
  248.        dw   32766
  249.        dw   32766
  250.        dw   32766
  251.        dw   32766
  252.        dw   32766
  253.        dw   32765
  254.        dw   32765
  255.        dw   32765
  256.        dw   32765
  257.        dw   32765
  258.        dw   32765
  259.        dw   32765
  260.        dw   32765
  261.        dw   32764
  262.        dw   32764
  263.        dw   32764
  264.        dw   32764
  265.        dw   32764
  266.        dw   32764
  267.        dw   32764
  268.        dw   32763
  269.        dw   32763
  270.        dw   32763
  271.        dw   32763
  272.        dw   32763
  273.        dw   32762
  274.        dw   32762
  275.        dw   32762
  276.        dw   32762
  277.        dw   32762
  278.        dw   32761
  279.        dw   32761
  280.        dw   32761
  281.        dw   32761
  282.        dw   32760
  283.        dw   32760
  284.        dw   32760
  285.        dw   32760
  286.        dw   32759
  287.        dw   32759
  288.        dw   32759
  289.        dw   32759
  290.        dw   32758
  291.        dw   32758
  292.        dw   32758
  293.        dw   32758
  294.        dw   32757
  295.        dw   32757
  296. filtd:
  297.     dw  -4178
  298.     dw  -5415
  299.     dw   4323
  300.     dw   7299
  301.  
  302.     dw  -4545
  303.     dw  -5167
  304.     dw   6951
  305.  
  306.     dw   4513
  307.     dw   8819
  308.     dw   10635
  309. go:  ldpk 0         ; make sure that we are pointing to 0 data page
  310.      lack one   ; make and store one
  311.      sacl one
  312.      lac one,11
  313.      sacl clockf
  314.      lack filtd ; store address of the too large coefficients
  315.      tblr hl12
  316.      add one
  317.      tblr hl13
  318.      add one
  319.      tblr hl15
  320.      add one
  321.      tblr hl16
  322.      add one
  323.      tblr hu13
  324.      add one
  325.      tblr hu14
  326.      add one
  327.      tblr hu16
  328.      add one
  329.      tblr hb8
  330.      add one
  331.      tblr hb9
  332.      add one
  333.      tblr hb10
  334.      sacl masko
  335.      lt one
  336.      mpyk 3755
  337.      pac
  338.      sacl freqh
  339.      lac one,4
  340.      sacl thresh
  341.      lt one
  342.      mpyk 2048
  343.      pac
  344.      sacl freql
  345.      zac
  346.      sacl clockp
  347.      sub one
  348.      sacl mone  ; make and store minus one
  349.      sacl modem
  350.      lac one,14
  351.      sub one
  352.      sacl mask  ; make and store mask for modulo 16384 phase arithmetic
  353.      lac one,6
  354.      sub one
  355.      sacl maskl ; make and store fine part of address mask;
  356.      lac one,8     ; make and store frequency address in memory
  357.      sub one
  358.      
  359. ;  Okay the BS is over lets get to work !     
  360.      
  361. wait: bioz fire    ; is it time for a new sample     
  362.       b wait       ; nope go wait in the corner
  363. fire: in xn0,pa3   ; get a new sample here
  364.  
  365.      lac xn0,4
  366.      sub one,15   ; Change ADC format to two's complement
  367.      sacl xn0
  368.  
  369. ;     remodulator output
  370.  
  371.      lac thresh
  372.      sub energy
  373.      bgz noout
  374.      lac sine,6
  375.      addh masko
  376.      sach b0
  377.      out b0,pa4   ; send it to the TNC here
  378.                    ; as the following routines have a variable length
  379. ;     end output
  380. noout: lack one  ;
  381.      sacl mps  ;   Restore sine and cosine quadrant multipliers
  382.      sacl mpc  ;
  383. ;    
  384. ;              FINITE IMPULSE RESPONSE (FIR)
  385. ;            LINEAR PHASE DIGITAL FILTER DESIGN
  386. ;                REMEZ EXCHANGE ALGORITHM
  387.  
  388. ;                     BANDPASS FILTER
  389.  
  390. ;                   FILTER LENGTH =  33
  391. ;
  392. ;                       BAND  1       BAND  2       BAND  3
  393. ; LOWER BAND EDGE      .0000000      .1150000      .2290000
  394. ; UPPER BAND EDGE      .0550000      .1770000      .5000000
  395. ; DESIRED VALUE        .0000000     1.0000000      .0000000
  396. ; WEIGHTING           1.0000000     1.0000000     1.0000000
  397. ; DEVIATION            .0158519      .0158519      .0158519
  398. ; DEVIATION IN DB   -35.9983500      .1366083   -35.9983500
  399.  
  400. ; EXTREMAL FREQUENCIES--MAXIMA OF THE ERROR CURVE
  401. ;     .0000000    .0404412    .0550000    .1150000    .1241912
  402. ;     .1462500    .1664706    .1770000    .2290000    .2381912
  403. ;     .2620883    .2896618    .3190736    .3503236    .3834119
  404. ;     .4146619    .4514267    .5000000
  405. ;
  406. ;    FILTER for low side with the filter given above
  407. ;
  408.     zac ;  Zero the accumulator as we will be summing as we multiply
  409.     lt xn32
  410.     mpyk 270
  411.     
  412.     lta xn31
  413.     mpyk -212
  414.     
  415.     lta xn30
  416.     mpyk -670
  417.     
  418.     lta xn29
  419.     mpyk -680
  420.     
  421.     lta xn28
  422.     mpyk -25
  423.     
  424.     lta xn27
  425.     mpyk 610
  426.     
  427.     lta xn26
  428.     mpyk 479
  429.     
  430.     lta xn25
  431.     mpyk -19
  432.     
  433.     lta xn24
  434.     mpyk 317
  435.     
  436.     lta xn23
  437.     mpyk 1577
  438.     
  439.     lta xn22
  440.     mpyk 1907
  441.     
  442.     lta xn21
  443.     mpyk -447
  444.     
  445.     lta xn20
  446.     mpy hl12
  447.     
  448.     lta xn19
  449.     mpy hl13
  450.     
  451.     lta xn18
  452.     mpyk -1748
  453.     
  454.     lta xn17
  455.     mpy hl15
  456.     
  457.     lta xn16
  458.     mpy hl16
  459.     
  460.     lta xn15
  461.     mpy hl15
  462.     
  463.     lta xn14
  464.     mpyk -1748
  465.     
  466.     lta xn13
  467.     mpy hl13
  468.     
  469.     lta xn12
  470.     mpy hl12
  471.     
  472.     lta xn11
  473.     mpyk -447
  474.     
  475.     lta xn10
  476.     mpyk 1907
  477.     
  478.     lta xn9
  479.     mpyk 1507
  480.     
  481.     lta xn8
  482.     mpyk 317
  483.     
  484.     lta xn7
  485.     mpyk -19
  486.     
  487.     lta xn6
  488.     mpyk 479
  489.     
  490.     lta xn5
  491.     mpyk 610
  492.     
  493.     lta xn4
  494.     mpyk -25
  495.     
  496.     lta xn3
  497.     mpyk -680
  498.     
  499.     lta xn2
  500.     mpyk -670
  501.     
  502.     lta xn1
  503.     mpyk -212
  504.     
  505.     lta xn0
  506.     mpyk 270
  507.     apac
  508.     sach suml  ;  suml is the low side filter output
  509.     bgez posl
  510.     zac
  511.     sub suml
  512.     sacl suml
  513. posl:
  514. ;    
  515. ;
  516. ;              FINITE IMPULSE RESPONSE (FIR)
  517. ;            LINEAR PHASE DIGITAL FILTER DESIGN
  518. ;                REMEZ EXCHANGE ALGORITHM
  519.  
  520. ;                     BANDPASS FILTER
  521.  
  522. ;                   FILTER LENGTH =  33
  523.  
  524. ;                      BAND  1       BAND  2       BAND  3
  525. ; LOWER BAND EDGE      .0000000      .1770000      .2900000
  526. ; UPPER BAND EDGE      .1200000      .2290000      .5000000
  527. ; DESIRED VALUE        .0000000     1.0000000      .0000000
  528. ; WEIGHTING           1.0000000     1.0000000     1.0000000
  529. ; DEVIATION            .0114788      .0114788      .0114788
  530. ; DEVIATION IN DB   -38.8020300      .0991361   -38.8020300
  531. ;
  532. ;    FILTER for high side with the filter given above
  533. ;
  534.  
  535.     zac ;  Zero the accumulator as we will be summing as we multiply
  536.     lt xn32
  537.     mpyk -43
  538.     
  539.     ltd xn31
  540.     mpyk -642
  541.     
  542.     ltd xn30
  543.     mpyk -196
  544.     
  545.     ltd xn29
  546.     mpyk 612
  547.     
  548.     ltd xn28
  549.     mpyk 600
  550.     
  551.     ltd xn27
  552.     mpyk -201
  553.     
  554.     ltd xn26
  555.     mpyk -275
  556.     
  557.     ltd xn25
  558.     mpyk 115
  559.     
  560.     ltd xn24
  561.     mpyk -726
  562.     
  563.     ltd xn23
  564.     mpyk -1492
  565.     
  566.     ltd xn22
  567.     mpyk 785
  568.     
  569.     ltd xn21
  570.     mpyk 3790
  571.     
  572.     ltd xn20
  573.     mpyk 1545
  574.     
  575.     ltd xn19
  576.     mpy hu13
  577.     
  578.     ltd xn18
  579.     mpy hu14
  580.     
  581.     ltd xn17
  582.     mpyk 2078
  583.     
  584.     ltd xn16
  585.     mpy hu16
  586.     
  587.     ltd xn15
  588.     mpyk 2078
  589.     
  590.     ltd xn14
  591.     mpy hu14
  592.     
  593.     ltd xn13
  594.     mpy hu13
  595.     
  596.     ltd xn12
  597.     mpyk 1545
  598.     
  599.     ltd xn11
  600.     mpyk 3790
  601.     
  602.     ltd xn10
  603.     mpyk 785
  604.     
  605.     ltd xn9
  606.     mpyk -1492
  607.     
  608.     ltd xn8
  609.     mpyk -726
  610.     
  611.     ltd xn7
  612.     mpyk 115
  613.     
  614.     ltd xn6
  615.     mpyk -275
  616.     
  617.     ltd xn5
  618.     mpyk -201
  619.     
  620.     ltd xn4
  621.     mpyk 600
  622.     
  623.     ltd xn3
  624.     mpyk 612
  625.     
  626.     ltd xn2
  627.     mpyk -196
  628.     
  629.     ltd xn1
  630.     mpyk -642
  631.     
  632.     ltd xn0
  633.     mpyk -43
  634.     apac
  635.     sach sumh  ;  sumh is the high side filter output
  636.     bgez posh
  637.     zac
  638.     sub sumh
  639.     sacl sumh
  640. posh:
  641.     ;  load the high filter value subtract the low filter value
  642.     ;  send this through the LPF. 
  643.     lac sumh
  644.      sub suml
  645.     sacl b0
  646.     ; See if there is energy in the filters and use this as a data
  647.     ; squelch.  In other words, you must use the squelch on your radio
  648.     ; to turn the data squelch on and off
  649.     lac sumh,15
  650.     add suml,15
  651.     add energy,15
  652.     sach energy
  653.  
  654.  
  655. ;              FINITE IMPULSE RESPONSE (FIR)
  656. ;            LINEAR PHASE DIGITAL FILTER DESIGN
  657. ;                REMEZ EXCHANGE ALGORITHM
  658.  
  659. ;                     BANDPASS FILTER
  660.  
  661. ;                   FILTER LENGTH =  21
  662.  
  663. ;                       BAND  1       BAND  2
  664. ; LOWER BAND EDGE      .0000000      .1750000
  665. ; UPPER BAND EDGE      .1250000      .5000000
  666. ; DESIRED VALUE       1.0000000      .0000000
  667. ; WEIGHTING           1.0000000     1.0000000
  668. ; DEVIATION            .0687429      .0687429
  669. ; DEVIATION IN DB      .5774649   -23.2554400
  670. ;
  671. ;    LPF the splitter output and this is the bits
  672. ;
  673. ;
  674. ;    If the bit is positive output 2200 else output 1200
  675. ;
  676.     zac
  677.  
  678.     lt b20
  679.     mpyk -431
  680.     
  681.     ltd b19
  682.     mpyk 323
  683.     
  684.     ltd b18
  685.     mpyk 821
  686.     
  687.     ltd b17
  688.     mpyk 801
  689.     
  690.     ltd b16
  691.     mpyk -185
  692.     
  693.     ltd b15
  694.     mpyk -1568
  695.     
  696.     ltd b14
  697.     mpyk -1844
  698.     
  699.     ltd b13
  700.     mpyk 269
  701.     
  702.     ltd b12
  703.     mpy hb8
  704.     
  705.     ltd b11
  706.     mpy hb9
  707.     
  708.     ltd b10
  709.     mpy hb10
  710.     
  711.     ltd b9
  712.     mpy hb9
  713.     
  714.     ltd b8
  715.     mpy hb8
  716.     
  717.     ltd b7
  718.     mpyk 269
  719.     
  720.     ltd b6
  721.     mpyk -1844
  722.     
  723.     ltd b5
  724.     mpyk -1568
  725.     
  726.     ltd b4
  727.     mpyk -185
  728.     
  729.     ltd b3
  730.     mpyk 801
  731.     
  732.     ltd b2
  733.     mpyk 821
  734.     
  735.     ltd b1
  736.     mpyk 323 
  737.     
  738.     ltd b0
  739.     mpyk -431
  740.     apac
  741.     sach b0
  742. ;    b0 contains the bandlimited noisy bit value.  Recover the clock
  743. ;    so that we may choose point of maximum eye opening for the bit
  744. ;       decision.
  745. ;
  746. ;    The clock recovery nonlinearity begins with absolute value
  747.     lac b0
  748.     bgez addc
  749.     zac
  750.     sub b0
  751. addc:   sacl clocke
  752. ;    Keep a IIR LPF version of this so that the DC may be subtracted
  753. ;    and get a clock tone at the data rate.
  754. ;    Simplest IIR,  0.5*old value + 0.5 * new value
  755. ;
  756.     lac clocka,15
  757.     add clocke,15
  758.     sach clocka
  759. ;    Subtract off DC
  760.     lac clocke
  761.     sub clocka
  762.     sacl clocke
  763. ;    get sine from tones that runs at the clock rate
  764.     lac clockp
  765.     call tones
  766.     zac
  767. ;    mix (multiply) with the clock signal from above
  768.     lt sine
  769.     mpy clocke
  770.     spac
  771. ;    taking the negative of this (spac from a zero'd accumulator)
  772.     sach clocke
  773. ;    using a gain of 1/8 add correction into the old clock phase plus
  774. ;    the phase increment (frequency)
  775.     lac clocke,13
  776.     sach clocke
  777.     lac clockf
  778.     add clockp
  779.     add clocke
  780.     sacl clockp
  781. ;    After storing the new clock phase test to see if we have passed
  782. ;    two pi at which time we will take the value of b0 for the bit value
  783. ;    Since this is the point of maximal eye opening.  If the phase has
  784. ;    been corrected negative put back between 0 and 2pi.
  785.     bgez gpi
  786.     add one,14
  787.     sacl clockp
  788.     b outt
  789. gpi:    lac one,14
  790.     sub clockp
  791.     blz nfrq
  792.     b outt
  793. nfrq:    lac clockp
  794.     and mask
  795.     sacl clockp
  796.     lac b0
  797. ;    bit positive?
  798.     bgez posb
  799. ;    No load low frequency for this bit period
  800.     lac freql
  801.     b newf
  802. ;    Yes load high frequency for this bit period
  803. posb:   lac freqh
  804. newf:    sacl freqo
  805. ;    freqo is the output frequency for the remodulator
  806. outt:    lack one
  807.     sacl mpc
  808.     sacl mps
  809.     lac freqo
  810.     add phaseo
  811.     and mask
  812.     sacl phaseo
  813.     call tones
  814.     b wait
  815. ;     complex tone generator if modem>0 if modem<0 sine wave generator
  816.  
  817. tones: sacl wkph  ;  store a working copy
  818.      lac wkph,4
  819.      subh one
  820.      blz getem  ;  is it in a quadrant bigger than first?
  821.      subh one
  822.      bgez thfr; is it in a quadrant greater than two?
  823.      lac 1,13  ;  nope so load pi
  824.      sub wkph  ;  subtract phase so that it maps back into 1st quad
  825.      sacl wkph ; store
  826.      lac mone  ; load -1
  827.      sacl mpc  ; store it in the cosine multiplier
  828.      b getem   ; go read tables
  829. thfr: lac mone  ; multiplier for bottom half
  830.      sacl mps  ; store
  831.      lac wkph  ; 
  832.      sub one,13 ; map angle back to  upper half and go do it again
  833.      b tones
  834. getem: lac wkph,10 ; take 1st quadrant phase equiv for sine and pick 
  835.                    ; off coarse part of phase address
  836.      sach coph     ; store it
  837.      lack sintbl   ;  load sine table offset into accumulator
  838.      add coph      ; add coarse address off set
  839.      tblr sinx     ; read the coarse sine value
  840.      lac one,6     ;  load pi/2
  841.      sub coph      ; subtract the coarse phase to get cosines offset
  842.      sacl coph      
  843.      lack sintbl
  844.      add coph      ; do same as above for coarse cosine
  845.      tblr cosx
  846.      lac wkph      ; load working phase
  847.      and maskl     ;  mask off fine addres
  848.      sacl coph     ; store it
  849.      lack fines    ; locate fine table offset
  850.      add coph      ; add for offset into fine table
  851.      tblr siny     ;  read table
  852.      lack finec
  853.      add coph
  854.      tblr cosy
  855.      zac
  856.      lt sinx       ; load sinx
  857.      mpy cosy      ;  multiply by cosy
  858.      lta siny      ; load t reg with fine sin and accumulate previous prod.
  859.      mpy cosx      ; multiply by coarse cosx to use sin(X+Y)
  860.      apac          ; add the result to coarse sine
  861.      sach sine     ; store it.
  862.      lac modem 
  863.      blz mult
  864.      lac 1,12      ; load full address pi/2
  865.      sub wkph      ; subtract the working phase to get cosine
  866.      sacl wkph 
  867.      lac wkph,10   ;  from here to the later MARK it is identical to above
  868.      sach coph
  869.      lack sintbl
  870.      add coph
  871.      tblr sinx
  872.      lac one,6
  873.      sub coph
  874.      sacl coph
  875.      lack sintbl
  876.      add coph
  877.      tblr cosx
  878.      lac wkph
  879.      and maskl
  880.      sacl coph
  881.      lack fines
  882.      add coph
  883.      tblr siny
  884.      lack finec
  885.      add coph
  886.      tblr cosy
  887.      zac
  888.      lt cosy
  889.      mpy sinx
  890.      lta siny
  891.      mpy cosx
  892.      apac  ; MARK
  893.      sach cosine ; store it in the cosine
  894. mult: lt mps;  now we need to do a few multiplies by sign changes due to
  895.      mpy sine ; to quadrant part of phase address
  896.      pac;     multiply sine by sine sign (:-)  and
  897.      sacl sine ;  store the result
  898.      lac modem
  899.      bgz cosm
  900.      ret
  901. cosm: mpy cosine;  now multiply cosine by the same
  902.      pac
  903.      sacl cosine ; store it
  904.      lt mpc;  load cosine differentiator from sine sign (:-)
  905.      mpy cosine;  multiply
  906.      pac
  907.      sacl cosine ; store
  908.      ret
  909.      end
  910. ;  Ebbly Ebbly Ebbly thats all folks
  911.  
  912.  
  913.  
  914.